package br.com.android.aluno.comunicacao;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ConnectException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;

import android.util.Log;

public class HttpClientImpl extends Http {

	@Override
	public String doPost(String url, Map<String, String> map) {
		try {
			HttpClient httpClient = new DefaultHttpClient(); //responsavel por fazer uma requisicao http. Se ela for do tipo get, usaremos a classe HttpGet
			HttpPost httpPost = new HttpPost(url);

			Log.i(ConstantesComunicacao.LOG_COM, "HttpClient.post " + httpPost.getURI());
						
			List<NameValuePair> params = getParams(map); //Cria os parametros
			httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
			
			Log.i(ConstantesComunicacao.LOG_COM, "HttpClient.params " + params);
			HttpResponse response = httpClient.execute(httpPost); //envia a requisicao ao servidor.

			Log.i(ConstantesComunicacao.LOG_COM, "-------------------------------");
			Log.i(ConstantesComunicacao.LOG_COM, String.valueOf(response.getStatusLine()));
			Log.i(ConstantesComunicacao.LOG_COM, "-------------------------------");

			HttpEntity entity = response.getEntity();
			if (entity != null) {
				Log.i(ConstantesComunicacao.LOG_COM, "Lendo resposta.");
				InputStream in = entity.getContent(); //a resposta eh automaticamente retornada como uma InputStream
				String texto = readString(in);
				return texto;
			}

		} catch (Exception e) {
			Log.i(ConstantesComunicacao.LOG_COM, e.getMessage(), e);
		}

		return null;
	}

	@Override
	public String doPost(String url, String params) throws ConnectException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String downloadArquivo(String url) {
		try {
			HttpClient httpClient = new DefaultHttpClient(); //responsavel por fazer uma requisicao http. Se ela for do tipo get, usaremos a classe HttpGet
			HttpGet httpGet = new HttpGet(url);

			Log.i(ConstantesComunicacao.LOG_COM, "request " + httpGet.getURI());
			HttpResponse response = httpClient.execute(httpGet); //envia a requisicao ao servidor.

			Log.i(ConstantesComunicacao.LOG_COM, "-------------------------------");
			Log.i(ConstantesComunicacao.LOG_COM, String.valueOf(response.getStatusLine()));
			Log.i(ConstantesComunicacao.LOG_COM, "-------------------------------");

			HttpEntity entity = response.getEntity();
			if (entity != null) {
				Log.i(ConstantesComunicacao.LOG_COM, "Lendo resposta.");
				InputStream in = entity.getContent(); //a resposta eh automaticamente retornada como uma InputStream
				String texto = readString(in);
				return texto;
			}

		} catch (Exception e) {
			Log.i(ConstantesComunicacao.LOG_COM, e.getMessage(), e);
		}

		return null;
	}

	@Override
	public byte[] downloadImagem(String url) {
		try {
			HttpClient httpClient = new DefaultHttpClient(); //responsavel por fazer uma requisicao http. Se ela for do tipo get, usaremos a classe HttpGet
			HttpGet httpGet = new HttpGet(url);

			Log.i(ConstantesComunicacao.LOG_COM, "request " + httpGet.getURI());
			HttpResponse response = httpClient.execute(httpGet); //envia a requisicao ao servidor.

			Log.i(ConstantesComunicacao.LOG_COM, "-------------------------------");
			Log.i(ConstantesComunicacao.LOG_COM, String.valueOf(response.getStatusLine()));
			Log.i(ConstantesComunicacao.LOG_COM, "-------------------------------");

			HttpEntity entity = response.getEntity();
			if (entity != null) {
				Log.i(ConstantesComunicacao.LOG_COM, "Lendo resposta.");
				InputStream in = entity.getContent(); //a resposta eh automaticamente retornada como uma InputStream
				byte[] bytesImg = readBytes(in);
				return bytesImg;
			}

		} catch (Exception e) {
			Log.i(ConstantesComunicacao.LOG_COM, e.getMessage(), e);
		}

		return null;
	}

	private String readString(InputStream in) throws IOException {
		byte[] bytes = readBytes(in);
		String texto = new String(bytes);

		return texto;
	}

	private byte[] readBytes(InputStream in) throws IOException {
		ByteArrayOutputStream bos = new ByteArrayOutputStream();

		try {
			byte[] buf = new byte[1024];
			int len;

			while ((len = in.read(buf)) > 0) {
				bos.write(buf, 0, len);
			}
			byte[] bytes = bos.toByteArray();
			return bytes;

		} finally {
			bos.close();
		}
	}

	private List<NameValuePair> getParams(Map<String, String> map) {
		if (map == null || map.size() == 0) {
			return null;
		}

		List<NameValuePair> params = new ArrayList<NameValuePair>();
		Iterator it = (Iterator) map.keySet().iterator();
		
		while (it.hasNext()) {
			String name = (String) it.next();
			Object value = map.get(name);
			params.add(new BasicNameValuePair(name, String.valueOf(value)));
		}
		
		return params;
	}
}
